{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 导入工具包\n",
    "\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "import seaborn as sns;sns.set()\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Time</th>\n",
       "      <th>V1</th>\n",
       "      <th>V2</th>\n",
       "      <th>V3</th>\n",
       "      <th>V4</th>\n",
       "      <th>V5</th>\n",
       "      <th>V6</th>\n",
       "      <th>V7</th>\n",
       "      <th>V8</th>\n",
       "      <th>V9</th>\n",
       "      <th>...</th>\n",
       "      <th>V21</th>\n",
       "      <th>V22</th>\n",
       "      <th>V23</th>\n",
       "      <th>V24</th>\n",
       "      <th>V25</th>\n",
       "      <th>V26</th>\n",
       "      <th>V27</th>\n",
       "      <th>V28</th>\n",
       "      <th>Amount</th>\n",
       "      <th>Class</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.0</td>\n",
       "      <td>-1.359807</td>\n",
       "      <td>-0.072781</td>\n",
       "      <td>2.536347</td>\n",
       "      <td>1.378155</td>\n",
       "      <td>-0.338321</td>\n",
       "      <td>0.462388</td>\n",
       "      <td>0.239599</td>\n",
       "      <td>0.098698</td>\n",
       "      <td>0.363787</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.018307</td>\n",
       "      <td>0.277838</td>\n",
       "      <td>-0.110474</td>\n",
       "      <td>0.066928</td>\n",
       "      <td>0.128539</td>\n",
       "      <td>-0.189115</td>\n",
       "      <td>0.133558</td>\n",
       "      <td>-0.021053</td>\n",
       "      <td>149.62</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.0</td>\n",
       "      <td>1.191857</td>\n",
       "      <td>0.266151</td>\n",
       "      <td>0.166480</td>\n",
       "      <td>0.448154</td>\n",
       "      <td>0.060018</td>\n",
       "      <td>-0.082361</td>\n",
       "      <td>-0.078803</td>\n",
       "      <td>0.085102</td>\n",
       "      <td>-0.255425</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.225775</td>\n",
       "      <td>-0.638672</td>\n",
       "      <td>0.101288</td>\n",
       "      <td>-0.339846</td>\n",
       "      <td>0.167170</td>\n",
       "      <td>0.125895</td>\n",
       "      <td>-0.008983</td>\n",
       "      <td>0.014724</td>\n",
       "      <td>2.69</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>-1.358354</td>\n",
       "      <td>-1.340163</td>\n",
       "      <td>1.773209</td>\n",
       "      <td>0.379780</td>\n",
       "      <td>-0.503198</td>\n",
       "      <td>1.800499</td>\n",
       "      <td>0.791461</td>\n",
       "      <td>0.247676</td>\n",
       "      <td>-1.514654</td>\n",
       "      <td>...</td>\n",
       "      <td>0.247998</td>\n",
       "      <td>0.771679</td>\n",
       "      <td>0.909412</td>\n",
       "      <td>-0.689281</td>\n",
       "      <td>-0.327642</td>\n",
       "      <td>-0.139097</td>\n",
       "      <td>-0.055353</td>\n",
       "      <td>-0.059752</td>\n",
       "      <td>378.66</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.966272</td>\n",
       "      <td>-0.185226</td>\n",
       "      <td>1.792993</td>\n",
       "      <td>-0.863291</td>\n",
       "      <td>-0.010309</td>\n",
       "      <td>1.247203</td>\n",
       "      <td>0.237609</td>\n",
       "      <td>0.377436</td>\n",
       "      <td>-1.387024</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.108300</td>\n",
       "      <td>0.005274</td>\n",
       "      <td>-0.190321</td>\n",
       "      <td>-1.175575</td>\n",
       "      <td>0.647376</td>\n",
       "      <td>-0.221929</td>\n",
       "      <td>0.062723</td>\n",
       "      <td>0.061458</td>\n",
       "      <td>123.50</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2.0</td>\n",
       "      <td>-1.158233</td>\n",
       "      <td>0.877737</td>\n",
       "      <td>1.548718</td>\n",
       "      <td>0.403034</td>\n",
       "      <td>-0.407193</td>\n",
       "      <td>0.095921</td>\n",
       "      <td>0.592941</td>\n",
       "      <td>-0.270533</td>\n",
       "      <td>0.817739</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.009431</td>\n",
       "      <td>0.798278</td>\n",
       "      <td>-0.137458</td>\n",
       "      <td>0.141267</td>\n",
       "      <td>-0.206010</td>\n",
       "      <td>0.502292</td>\n",
       "      <td>0.219422</td>\n",
       "      <td>0.215153</td>\n",
       "      <td>69.99</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 31 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   Time        V1        V2        V3        V4        V5        V6        V7  \\\n",
       "0   0.0 -1.359807 -0.072781  2.536347  1.378155 -0.338321  0.462388  0.239599   \n",
       "1   0.0  1.191857  0.266151  0.166480  0.448154  0.060018 -0.082361 -0.078803   \n",
       "2   1.0 -1.358354 -1.340163  1.773209  0.379780 -0.503198  1.800499  0.791461   \n",
       "3   1.0 -0.966272 -0.185226  1.792993 -0.863291 -0.010309  1.247203  0.237609   \n",
       "4   2.0 -1.158233  0.877737  1.548718  0.403034 -0.407193  0.095921  0.592941   \n",
       "\n",
       "         V8        V9  ...       V21       V22       V23       V24       V25  \\\n",
       "0  0.098698  0.363787  ... -0.018307  0.277838 -0.110474  0.066928  0.128539   \n",
       "1  0.085102 -0.255425  ... -0.225775 -0.638672  0.101288 -0.339846  0.167170   \n",
       "2  0.247676 -1.514654  ...  0.247998  0.771679  0.909412 -0.689281 -0.327642   \n",
       "3  0.377436 -1.387024  ... -0.108300  0.005274 -0.190321 -1.175575  0.647376   \n",
       "4 -0.270533  0.817739  ... -0.009431  0.798278 -0.137458  0.141267 -0.206010   \n",
       "\n",
       "        V26       V27       V28  Amount  Class  \n",
       "0 -0.189115  0.133558 -0.021053  149.62      0  \n",
       "1  0.125895 -0.008983  0.014724    2.69      0  \n",
       "2 -0.139097 -0.055353 -0.059752  378.66      0  \n",
       "3 -0.221929  0.062723  0.061458  123.50      0  \n",
       "4  0.502292  0.219422  0.215153   69.99      0  \n",
       "\n",
       "[5 rows x 31 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_csv('D:\\\\Py_dataset\\\\creditcard.csv')\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 284807 entries, 0 to 284806\n",
      "Data columns (total 31 columns):\n",
      "Time      284807 non-null float64\n",
      "V1        284807 non-null float64\n",
      "V2        284807 non-null float64\n",
      "V3        284807 non-null float64\n",
      "V4        284807 non-null float64\n",
      "V5        284807 non-null float64\n",
      "V6        284807 non-null float64\n",
      "V7        284807 non-null float64\n",
      "V8        284807 non-null float64\n",
      "V9        284807 non-null float64\n",
      "V10       284807 non-null float64\n",
      "V11       284807 non-null float64\n",
      "V12       284807 non-null float64\n",
      "V13       284807 non-null float64\n",
      "V14       284807 non-null float64\n",
      "V15       284807 non-null float64\n",
      "V16       284807 non-null float64\n",
      "V17       284807 non-null float64\n",
      "V18       284807 non-null float64\n",
      "V19       284807 non-null float64\n",
      "V20       284807 non-null float64\n",
      "V21       284807 non-null float64\n",
      "V22       284807 non-null float64\n",
      "V23       284807 non-null float64\n",
      "V24       284807 non-null float64\n",
      "V25       284807 non-null float64\n",
      "V26       284807 non-null float64\n",
      "V27       284807 non-null float64\n",
      "V28       284807 non-null float64\n",
      "Amount    284807 non-null float64\n",
      "Class     284807 non-null int64\n",
      "dtypes: float64(30), int64(1)\n",
      "memory usage: 67.4 MB\n"
     ]
    }
   ],
   "source": [
    "df.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Time</th>\n",
       "      <th>V1</th>\n",
       "      <th>V2</th>\n",
       "      <th>V3</th>\n",
       "      <th>V4</th>\n",
       "      <th>V5</th>\n",
       "      <th>V6</th>\n",
       "      <th>V7</th>\n",
       "      <th>V8</th>\n",
       "      <th>V9</th>\n",
       "      <th>...</th>\n",
       "      <th>V21</th>\n",
       "      <th>V22</th>\n",
       "      <th>V23</th>\n",
       "      <th>V24</th>\n",
       "      <th>V25</th>\n",
       "      <th>V26</th>\n",
       "      <th>V27</th>\n",
       "      <th>V28</th>\n",
       "      <th>Amount</th>\n",
       "      <th>Class</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>284807.000000</td>\n",
       "      <td>2.848070e+05</td>\n",
       "      <td>2.848070e+05</td>\n",
       "      <td>2.848070e+05</td>\n",
       "      <td>2.848070e+05</td>\n",
       "      <td>2.848070e+05</td>\n",
       "      <td>2.848070e+05</td>\n",
       "      <td>2.848070e+05</td>\n",
       "      <td>2.848070e+05</td>\n",
       "      <td>2.848070e+05</td>\n",
       "      <td>...</td>\n",
       "      <td>2.848070e+05</td>\n",
       "      <td>2.848070e+05</td>\n",
       "      <td>2.848070e+05</td>\n",
       "      <td>2.848070e+05</td>\n",
       "      <td>2.848070e+05</td>\n",
       "      <td>2.848070e+05</td>\n",
       "      <td>2.848070e+05</td>\n",
       "      <td>2.848070e+05</td>\n",
       "      <td>284807.000000</td>\n",
       "      <td>284807.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>94813.859575</td>\n",
       "      <td>3.919560e-15</td>\n",
       "      <td>5.688174e-16</td>\n",
       "      <td>-8.769071e-15</td>\n",
       "      <td>2.782312e-15</td>\n",
       "      <td>-1.552563e-15</td>\n",
       "      <td>2.010663e-15</td>\n",
       "      <td>-1.694249e-15</td>\n",
       "      <td>-1.927028e-16</td>\n",
       "      <td>-3.137024e-15</td>\n",
       "      <td>...</td>\n",
       "      <td>1.537294e-16</td>\n",
       "      <td>7.959909e-16</td>\n",
       "      <td>5.367590e-16</td>\n",
       "      <td>4.458112e-15</td>\n",
       "      <td>1.453003e-15</td>\n",
       "      <td>1.699104e-15</td>\n",
       "      <td>-3.660161e-16</td>\n",
       "      <td>-1.206049e-16</td>\n",
       "      <td>88.349619</td>\n",
       "      <td>0.001727</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>47488.145955</td>\n",
       "      <td>1.958696e+00</td>\n",
       "      <td>1.651309e+00</td>\n",
       "      <td>1.516255e+00</td>\n",
       "      <td>1.415869e+00</td>\n",
       "      <td>1.380247e+00</td>\n",
       "      <td>1.332271e+00</td>\n",
       "      <td>1.237094e+00</td>\n",
       "      <td>1.194353e+00</td>\n",
       "      <td>1.098632e+00</td>\n",
       "      <td>...</td>\n",
       "      <td>7.345240e-01</td>\n",
       "      <td>7.257016e-01</td>\n",
       "      <td>6.244603e-01</td>\n",
       "      <td>6.056471e-01</td>\n",
       "      <td>5.212781e-01</td>\n",
       "      <td>4.822270e-01</td>\n",
       "      <td>4.036325e-01</td>\n",
       "      <td>3.300833e-01</td>\n",
       "      <td>250.120109</td>\n",
       "      <td>0.041527</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>-5.640751e+01</td>\n",
       "      <td>-7.271573e+01</td>\n",
       "      <td>-4.832559e+01</td>\n",
       "      <td>-5.683171e+00</td>\n",
       "      <td>-1.137433e+02</td>\n",
       "      <td>-2.616051e+01</td>\n",
       "      <td>-4.355724e+01</td>\n",
       "      <td>-7.321672e+01</td>\n",
       "      <td>-1.343407e+01</td>\n",
       "      <td>...</td>\n",
       "      <td>-3.483038e+01</td>\n",
       "      <td>-1.093314e+01</td>\n",
       "      <td>-4.480774e+01</td>\n",
       "      <td>-2.836627e+00</td>\n",
       "      <td>-1.029540e+01</td>\n",
       "      <td>-2.604551e+00</td>\n",
       "      <td>-2.256568e+01</td>\n",
       "      <td>-1.543008e+01</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>54201.500000</td>\n",
       "      <td>-9.203734e-01</td>\n",
       "      <td>-5.985499e-01</td>\n",
       "      <td>-8.903648e-01</td>\n",
       "      <td>-8.486401e-01</td>\n",
       "      <td>-6.915971e-01</td>\n",
       "      <td>-7.682956e-01</td>\n",
       "      <td>-5.540759e-01</td>\n",
       "      <td>-2.086297e-01</td>\n",
       "      <td>-6.430976e-01</td>\n",
       "      <td>...</td>\n",
       "      <td>-2.283949e-01</td>\n",
       "      <td>-5.423504e-01</td>\n",
       "      <td>-1.618463e-01</td>\n",
       "      <td>-3.545861e-01</td>\n",
       "      <td>-3.171451e-01</td>\n",
       "      <td>-3.269839e-01</td>\n",
       "      <td>-7.083953e-02</td>\n",
       "      <td>-5.295979e-02</td>\n",
       "      <td>5.600000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>84692.000000</td>\n",
       "      <td>1.810880e-02</td>\n",
       "      <td>6.548556e-02</td>\n",
       "      <td>1.798463e-01</td>\n",
       "      <td>-1.984653e-02</td>\n",
       "      <td>-5.433583e-02</td>\n",
       "      <td>-2.741871e-01</td>\n",
       "      <td>4.010308e-02</td>\n",
       "      <td>2.235804e-02</td>\n",
       "      <td>-5.142873e-02</td>\n",
       "      <td>...</td>\n",
       "      <td>-2.945017e-02</td>\n",
       "      <td>6.781943e-03</td>\n",
       "      <td>-1.119293e-02</td>\n",
       "      <td>4.097606e-02</td>\n",
       "      <td>1.659350e-02</td>\n",
       "      <td>-5.213911e-02</td>\n",
       "      <td>1.342146e-03</td>\n",
       "      <td>1.124383e-02</td>\n",
       "      <td>22.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>139320.500000</td>\n",
       "      <td>1.315642e+00</td>\n",
       "      <td>8.037239e-01</td>\n",
       "      <td>1.027196e+00</td>\n",
       "      <td>7.433413e-01</td>\n",
       "      <td>6.119264e-01</td>\n",
       "      <td>3.985649e-01</td>\n",
       "      <td>5.704361e-01</td>\n",
       "      <td>3.273459e-01</td>\n",
       "      <td>5.971390e-01</td>\n",
       "      <td>...</td>\n",
       "      <td>1.863772e-01</td>\n",
       "      <td>5.285536e-01</td>\n",
       "      <td>1.476421e-01</td>\n",
       "      <td>4.395266e-01</td>\n",
       "      <td>3.507156e-01</td>\n",
       "      <td>2.409522e-01</td>\n",
       "      <td>9.104512e-02</td>\n",
       "      <td>7.827995e-02</td>\n",
       "      <td>77.165000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>172792.000000</td>\n",
       "      <td>2.454930e+00</td>\n",
       "      <td>2.205773e+01</td>\n",
       "      <td>9.382558e+00</td>\n",
       "      <td>1.687534e+01</td>\n",
       "      <td>3.480167e+01</td>\n",
       "      <td>7.330163e+01</td>\n",
       "      <td>1.205895e+02</td>\n",
       "      <td>2.000721e+01</td>\n",
       "      <td>1.559499e+01</td>\n",
       "      <td>...</td>\n",
       "      <td>2.720284e+01</td>\n",
       "      <td>1.050309e+01</td>\n",
       "      <td>2.252841e+01</td>\n",
       "      <td>4.584549e+00</td>\n",
       "      <td>7.519589e+00</td>\n",
       "      <td>3.517346e+00</td>\n",
       "      <td>3.161220e+01</td>\n",
       "      <td>3.384781e+01</td>\n",
       "      <td>25691.160000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>8 rows × 31 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                Time            V1            V2            V3            V4  \\\n",
       "count  284807.000000  2.848070e+05  2.848070e+05  2.848070e+05  2.848070e+05   \n",
       "mean    94813.859575  3.919560e-15  5.688174e-16 -8.769071e-15  2.782312e-15   \n",
       "std     47488.145955  1.958696e+00  1.651309e+00  1.516255e+00  1.415869e+00   \n",
       "min         0.000000 -5.640751e+01 -7.271573e+01 -4.832559e+01 -5.683171e+00   \n",
       "25%     54201.500000 -9.203734e-01 -5.985499e-01 -8.903648e-01 -8.486401e-01   \n",
       "50%     84692.000000  1.810880e-02  6.548556e-02  1.798463e-01 -1.984653e-02   \n",
       "75%    139320.500000  1.315642e+00  8.037239e-01  1.027196e+00  7.433413e-01   \n",
       "max    172792.000000  2.454930e+00  2.205773e+01  9.382558e+00  1.687534e+01   \n",
       "\n",
       "                 V5            V6            V7            V8            V9  \\\n",
       "count  2.848070e+05  2.848070e+05  2.848070e+05  2.848070e+05  2.848070e+05   \n",
       "mean  -1.552563e-15  2.010663e-15 -1.694249e-15 -1.927028e-16 -3.137024e-15   \n",
       "std    1.380247e+00  1.332271e+00  1.237094e+00  1.194353e+00  1.098632e+00   \n",
       "min   -1.137433e+02 -2.616051e+01 -4.355724e+01 -7.321672e+01 -1.343407e+01   \n",
       "25%   -6.915971e-01 -7.682956e-01 -5.540759e-01 -2.086297e-01 -6.430976e-01   \n",
       "50%   -5.433583e-02 -2.741871e-01  4.010308e-02  2.235804e-02 -5.142873e-02   \n",
       "75%    6.119264e-01  3.985649e-01  5.704361e-01  3.273459e-01  5.971390e-01   \n",
       "max    3.480167e+01  7.330163e+01  1.205895e+02  2.000721e+01  1.559499e+01   \n",
       "\n",
       "       ...           V21           V22           V23           V24  \\\n",
       "count  ...  2.848070e+05  2.848070e+05  2.848070e+05  2.848070e+05   \n",
       "mean   ...  1.537294e-16  7.959909e-16  5.367590e-16  4.458112e-15   \n",
       "std    ...  7.345240e-01  7.257016e-01  6.244603e-01  6.056471e-01   \n",
       "min    ... -3.483038e+01 -1.093314e+01 -4.480774e+01 -2.836627e+00   \n",
       "25%    ... -2.283949e-01 -5.423504e-01 -1.618463e-01 -3.545861e-01   \n",
       "50%    ... -2.945017e-02  6.781943e-03 -1.119293e-02  4.097606e-02   \n",
       "75%    ...  1.863772e-01  5.285536e-01  1.476421e-01  4.395266e-01   \n",
       "max    ...  2.720284e+01  1.050309e+01  2.252841e+01  4.584549e+00   \n",
       "\n",
       "                V25           V26           V27           V28         Amount  \\\n",
       "count  2.848070e+05  2.848070e+05  2.848070e+05  2.848070e+05  284807.000000   \n",
       "mean   1.453003e-15  1.699104e-15 -3.660161e-16 -1.206049e-16      88.349619   \n",
       "std    5.212781e-01  4.822270e-01  4.036325e-01  3.300833e-01     250.120109   \n",
       "min   -1.029540e+01 -2.604551e+00 -2.256568e+01 -1.543008e+01       0.000000   \n",
       "25%   -3.171451e-01 -3.269839e-01 -7.083953e-02 -5.295979e-02       5.600000   \n",
       "50%    1.659350e-02 -5.213911e-02  1.342146e-03  1.124383e-02      22.000000   \n",
       "75%    3.507156e-01  2.409522e-01  9.104512e-02  7.827995e-02      77.165000   \n",
       "max    7.519589e+00  3.517346e+00  3.161220e+01  3.384781e+01   25691.160000   \n",
       "\n",
       "               Class  \n",
       "count  284807.000000  \n",
       "mean        0.001727  \n",
       "std         0.041527  \n",
       "min         0.000000  \n",
       "25%         0.000000  \n",
       "50%         0.000000  \n",
       "75%         0.000000  \n",
       "max         1.000000  \n",
       "\n",
       "[8 rows x 31 columns]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['Amount'] = StandardScaler().fit_transform(df[['Amount']])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(284807, 31)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'Frequency')"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df['Class'].value_counts(ascending = False).plot(kind = 'bar')\n",
    "plt.title('Fraud class histogram')\n",
    "plt.xlabel('Class')\n",
    "plt.ylabel('Frequency')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    284315\n",
       "1       492\n",
       "Name: Class, dtype: int64"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['Class'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.1727485630620034"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fraud_percent = 100 * (df['Class'] == 1).sum()/len(df)\n",
    "fraud_percent"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "由上述的统计结果可以看出，我们的这份数据集是非常不均衡的，异常数据的比例只占到总数0.17%。所以对于该数据集，我们采用两种方法处理，下采样和过采样。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Time</th>\n",
       "      <th>V1</th>\n",
       "      <th>V2</th>\n",
       "      <th>V3</th>\n",
       "      <th>V4</th>\n",
       "      <th>V5</th>\n",
       "      <th>V6</th>\n",
       "      <th>V7</th>\n",
       "      <th>V8</th>\n",
       "      <th>V9</th>\n",
       "      <th>...</th>\n",
       "      <th>V21</th>\n",
       "      <th>V22</th>\n",
       "      <th>V23</th>\n",
       "      <th>V24</th>\n",
       "      <th>V25</th>\n",
       "      <th>V26</th>\n",
       "      <th>V27</th>\n",
       "      <th>V28</th>\n",
       "      <th>Amount</th>\n",
       "      <th>Class</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.0</td>\n",
       "      <td>-1.359807</td>\n",
       "      <td>-0.072781</td>\n",
       "      <td>2.536347</td>\n",
       "      <td>1.378155</td>\n",
       "      <td>-0.338321</td>\n",
       "      <td>0.462388</td>\n",
       "      <td>0.239599</td>\n",
       "      <td>0.098698</td>\n",
       "      <td>0.363787</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.018307</td>\n",
       "      <td>0.277838</td>\n",
       "      <td>-0.110474</td>\n",
       "      <td>0.066928</td>\n",
       "      <td>0.128539</td>\n",
       "      <td>-0.189115</td>\n",
       "      <td>0.133558</td>\n",
       "      <td>-0.021053</td>\n",
       "      <td>0.244964</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.0</td>\n",
       "      <td>1.191857</td>\n",
       "      <td>0.266151</td>\n",
       "      <td>0.166480</td>\n",
       "      <td>0.448154</td>\n",
       "      <td>0.060018</td>\n",
       "      <td>-0.082361</td>\n",
       "      <td>-0.078803</td>\n",
       "      <td>0.085102</td>\n",
       "      <td>-0.255425</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.225775</td>\n",
       "      <td>-0.638672</td>\n",
       "      <td>0.101288</td>\n",
       "      <td>-0.339846</td>\n",
       "      <td>0.167170</td>\n",
       "      <td>0.125895</td>\n",
       "      <td>-0.008983</td>\n",
       "      <td>0.014724</td>\n",
       "      <td>-0.342475</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>-1.358354</td>\n",
       "      <td>-1.340163</td>\n",
       "      <td>1.773209</td>\n",
       "      <td>0.379780</td>\n",
       "      <td>-0.503198</td>\n",
       "      <td>1.800499</td>\n",
       "      <td>0.791461</td>\n",
       "      <td>0.247676</td>\n",
       "      <td>-1.514654</td>\n",
       "      <td>...</td>\n",
       "      <td>0.247998</td>\n",
       "      <td>0.771679</td>\n",
       "      <td>0.909412</td>\n",
       "      <td>-0.689281</td>\n",
       "      <td>-0.327642</td>\n",
       "      <td>-0.139097</td>\n",
       "      <td>-0.055353</td>\n",
       "      <td>-0.059752</td>\n",
       "      <td>1.160686</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.966272</td>\n",
       "      <td>-0.185226</td>\n",
       "      <td>1.792993</td>\n",
       "      <td>-0.863291</td>\n",
       "      <td>-0.010309</td>\n",
       "      <td>1.247203</td>\n",
       "      <td>0.237609</td>\n",
       "      <td>0.377436</td>\n",
       "      <td>-1.387024</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.108300</td>\n",
       "      <td>0.005274</td>\n",
       "      <td>-0.190321</td>\n",
       "      <td>-1.175575</td>\n",
       "      <td>0.647376</td>\n",
       "      <td>-0.221929</td>\n",
       "      <td>0.062723</td>\n",
       "      <td>0.061458</td>\n",
       "      <td>0.140534</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2.0</td>\n",
       "      <td>-1.158233</td>\n",
       "      <td>0.877737</td>\n",
       "      <td>1.548718</td>\n",
       "      <td>0.403034</td>\n",
       "      <td>-0.407193</td>\n",
       "      <td>0.095921</td>\n",
       "      <td>0.592941</td>\n",
       "      <td>-0.270533</td>\n",
       "      <td>0.817739</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.009431</td>\n",
       "      <td>0.798278</td>\n",
       "      <td>-0.137458</td>\n",
       "      <td>0.141267</td>\n",
       "      <td>-0.206010</td>\n",
       "      <td>0.502292</td>\n",
       "      <td>0.219422</td>\n",
       "      <td>0.215153</td>\n",
       "      <td>-0.073403</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 31 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   Time        V1        V2        V3        V4        V5        V6        V7  \\\n",
       "0   0.0 -1.359807 -0.072781  2.536347  1.378155 -0.338321  0.462388  0.239599   \n",
       "1   0.0  1.191857  0.266151  0.166480  0.448154  0.060018 -0.082361 -0.078803   \n",
       "2   1.0 -1.358354 -1.340163  1.773209  0.379780 -0.503198  1.800499  0.791461   \n",
       "3   1.0 -0.966272 -0.185226  1.792993 -0.863291 -0.010309  1.247203  0.237609   \n",
       "4   2.0 -1.158233  0.877737  1.548718  0.403034 -0.407193  0.095921  0.592941   \n",
       "\n",
       "         V8        V9  ...       V21       V22       V23       V24       V25  \\\n",
       "0  0.098698  0.363787  ... -0.018307  0.277838 -0.110474  0.066928  0.128539   \n",
       "1  0.085102 -0.255425  ... -0.225775 -0.638672  0.101288 -0.339846  0.167170   \n",
       "2  0.247676 -1.514654  ...  0.247998  0.771679  0.909412 -0.689281 -0.327642   \n",
       "3  0.377436 -1.387024  ... -0.108300  0.005274 -0.190321 -1.175575  0.647376   \n",
       "4 -0.270533  0.817739  ... -0.009431  0.798278 -0.137458  0.141267 -0.206010   \n",
       "\n",
       "        V26       V27       V28    Amount  Class  \n",
       "0 -0.189115  0.133558 -0.021053  0.244964      0  \n",
       "1  0.125895 -0.008983  0.014724 -0.342475      0  \n",
       "2 -0.139097 -0.055353 -0.059752  1.160686      0  \n",
       "3 -0.221929  0.062723  0.061458  0.140534      0  \n",
       "4  0.502292  0.219422  0.215153 -0.073403      0  \n",
       "\n",
       "[5 rows x 31 columns]"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = df.drop('Time',axis = 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 下采样方案"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(284807, 29) (284807, 1)\n"
     ]
    }
   ],
   "source": [
    "#提取特征\n",
    "X = df.loc[:,df.columns != 'Class']\n",
    "#提取标签\n",
    "y = df.loc[:,df.columns == 'Class']\n",
    "\n",
    "print(X.shape,y.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "#得到异常样本的个数\n",
    "number_fraud_sample = len(df[df['Class'] == 1])\n",
    "\n",
    "#得到异常样本的索引\n",
    "fraud_index = np.array(df[df['Class'] == 1].index)\n",
    "\n",
    "#得到正常样本的索引\n",
    "normal_index = np.array(df[df['Class'] == 0].index)\n",
    "\n",
    "#在正常样本中，随机采样出指定数量的样本，并提取索引\n",
    "random_normal_index = np.random.choice(normal_index,number_fraud_sample,replace = False)\n",
    "random_normal_index = np.array(random_normal_index)\n",
    "\n",
    "#下采样所有样本的索引\n",
    "undersample_index = np.hstack((random_normal_index,fraud_index))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(984,)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "undersample_index.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "下采样数据的数量： 984\n",
      "正样本的比例:  0.5\n",
      "负样本的比例:  0.5\n"
     ]
    }
   ],
   "source": [
    "\n",
    "#下采样的数据点\n",
    "undersample_X = X.loc[undersample_index,:]\n",
    "undersample_y = y.loc[undersample_index,:]\n",
    "\n",
    "print('下采样数据的数量：',len(undersample_index))\n",
    "print('正样本的比例: ',len(random_normal_index)/len(undersample_X))\n",
    "print('负样本的比例: ',number_fraud_sample/len(undersample_X))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**对数据集进行划分**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练集的数量:  199364\n",
      "测试集的数量:  85443\n",
      "训练集的总量:  284807\n",
      " \n",
      "下采样训练集的数量:  688\n",
      "下采样测试集的数量:  296\n",
      "下采样训练集的总量:  984\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split,KFold\n",
    "\n",
    "#对整个数据集进行划分\n",
    "X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.3,random_state = 0)\n",
    "print('训练集的数量: ',len(X_train))\n",
    "print('测试集的数量: ',len(X_test))\n",
    "print('训练集的总量: ',len(X_train)+len(X_test))\n",
    "print(' ')\n",
    "\n",
    "#对下采样数据集进行划分\n",
    "X_train_undersample,X_test_undersample,y_train_undersample,y_test_undersample = train_test_split(undersample_X,undersample_y,test_size = 0.3,random_state = 0)\n",
    "print('下采样训练集的数量: ',len(X_train_undersample))\n",
    "print('下采样测试集的数量: ',len(X_test_undersample))\n",
    "print('下采样训练集的总量: ',len(X_train_undersample)+len(X_test_undersample))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**逻辑回归模型建立**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.metrics import recall_score,roc_auc_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "def printing_Kfold_scores(x_train_data,y_train_data):\n",
    "    kf = KFold(n_splits = 5)\n",
    "    #定义不同的正则化惩罚力度\n",
    "    c_param_range = [0.01,0.1,1,10,100]\n",
    "    #创建一个用于展示结果的表格\n",
    "    results_table = pd.DataFrame(index = range(len(c_param_range)),columns = ['C_parameter','Mean_recall_score'])\n",
    "    results_table['C_parameter'] = c_param_range\n",
    "    \n",
    "    j = 0\n",
    "    for c_param in c_param_range:\n",
    "        print('------------------------')\n",
    "        print('正则化惩罚力度: ',c_param)\n",
    "        print('-------------------------')\n",
    "        print(' ')\n",
    "        recall_accs = []\n",
    "        \n",
    "        for iteration,indices in enumerate(kf.split(x_train_data),start = 1):\n",
    "            #指定算法模型，并给定出事参数\n",
    "            Lr = LogisticRegression(C = c_param,penalty = 'l1')\n",
    "            Lr.fit(x_train_data.iloc[indices[0],:],y_train_data.iloc[indices[0],:].values.ravel())\n",
    "            y_pred_undersample = Lr.predict(x_train_data.iloc[indices[1],:])\n",
    "            recall_acc = recall_score(y_train_data.iloc[indices[1],:].values.ravel(),y_pred_undersample)\n",
    "            recall_accs.append(recall_acc)\n",
    "            print('Iteration: ',iteration,'召回率 = ',recall_acc)\n",
    "        #当执行完所有的交叉验证后，计算平均结果\n",
    "        results_table.loc[j,'Mean_recall_score'] = np.mean(recall_accs)\n",
    "        \n",
    "        j += 1\n",
    "        print(' ')\n",
    "        print('平均召回率: ',np.mean(recall_accs))\n",
    "        print(' ')\n",
    "    #找最好的参数，哪个位置的recall值最高\n",
    "    best_c = results_table.iloc[results_table['Mean_recall_score'].astype(np.float32).argmax()]['C_parameter']\n",
    "    print('------------------------------')\n",
    "    print('最好的惩罚力度参数: ',best_c)\n",
    "    print('-------------------------------')\n",
    "    return best_c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "------------------------\n",
      "正则化惩罚力度:  0.01\n",
      "-------------------------\n",
      " \n",
      "Iteration:  1 召回率 =  0.9846153846153847\n",
      "Iteration:  2 召回率 =  0.9692307692307692\n",
      "Iteration:  3 召回率 =  0.8987341772151899\n",
      "Iteration:  4 召回率 =  0.9682539682539683\n",
      "Iteration:  5 召回率 =  0.9436619718309859\n",
      " \n",
      "平均召回率:  0.9528992542292596\n",
      " \n",
      "------------------------\n",
      "正则化惩罚力度:  0.1\n",
      "-------------------------\n",
      " \n",
      "Iteration:  1 召回率 =  0.9230769230769231\n",
      "Iteration:  2 召回率 =  0.9230769230769231\n",
      "Iteration:  3 召回率 =  0.8354430379746836\n",
      "Iteration:  4 召回率 =  0.9365079365079365\n",
      "Iteration:  5 召回率 =  0.9295774647887324\n",
      " \n",
      "平均召回率:  0.9095364570850396\n",
      " \n",
      "------------------------\n",
      "正则化惩罚力度:  1\n",
      "-------------------------\n",
      " \n",
      "Iteration:  1 召回率 =  0.9538461538461539\n",
      "Iteration:  2 召回率 =  0.8923076923076924\n",
      "Iteration:  3 召回率 =  0.8227848101265823\n",
      "Iteration:  4 召回率 =  0.9365079365079365\n",
      "Iteration:  5 召回率 =  "
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9295774647887324\n",
      " \n",
      "平均召回率:  0.9070048115154193\n",
      " \n",
      "------------------------\n",
      "正则化惩罚力度:  10\n",
      "-------------------------\n",
      " \n",
      "Iteration:  1 召回率 =  0.9538461538461539\n",
      "Iteration:  2 召回率 =  0.8923076923076924\n",
      "Iteration:  3 召回率 =  0.8354430379746836\n",
      "Iteration:  4 召回率 =  0.9365079365079365\n",
      "Iteration:  5 召回率 =  0.9295774647887324\n",
      " \n",
      "平均召回率:  0.9095364570850396\n",
      " \n",
      "------------------------\n",
      "正则化惩罚力度:  100\n",
      "-------------------------\n",
      " \n",
      "Iteration:  1 召回率 =  0.9538461538461539\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration:  2 召回率 =  0.8923076923076924\n",
      "Iteration:  3 召回率 =  0.8481012658227848\n",
      "Iteration:  4 召回率 =  0.9365079365079365\n",
      "Iteration:  5 召回率 =  0.9295774647887324\n",
      " \n",
      "平均召回率:  0.9120681026546599\n",
      " \n",
      "------------------------------\n",
      "最好的惩罚力度参数:  0.01\n",
      "-------------------------------\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:33: FutureWarning: \n",
      "The current behaviour of 'Series.argmax' is deprecated, use 'idxmax'\n",
      "instead.\n",
      "The behavior of 'argmax' will be corrected to return the positional\n",
      "maximum in the future. For now, use 'series.values.argmax' or\n",
      "'np.argmax(np.array(values))' to get the position of the maximum\n",
      "row.\n"
     ]
    }
   ],
   "source": [
    "best_c = printing_Kfold_scores(X_train_undersample,y_train_undersample)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**混淆矩阵**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "召回率:  0.9328859060402684\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\validation.py:761: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
      "  y = column_or_1d(y, warn=True)\n"
     ]
    }
   ],
   "source": [
    "# 实例化lr模型\n",
    "\n",
    "Lr = LogisticRegression(C = best_c,penalty = 'l1')\n",
    "Lr.fit(X_train_undersample,y_train_undersample)\n",
    "y_pred_undersample = Lr.predict(X_test_undersample)\n",
    "\n",
    "cnf_matrix = confusion_matrix(y_test_undersample.values,y_pred_undersample)\n",
    "np.set_printoptions(precision=2)\n",
    "print('召回率: ',cnf_matrix[1,1]/(cnf_matrix[1,0] + cnf_matrix[1,1]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "绘制混淆矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "import itertools"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_confusion_matrix(cm, classes,\n",
    "                          normalize=False,\n",
    "                          title='Confusion matrix',\n",
    "                          cmap=plt.cm.Blues):\n",
    "    \"\"\"\n",
    "    This function prints and plots the confusion matrix.\n",
    "    Normalization can be applied by setting `normalize=True`.\n",
    "    \"\"\"\n",
    "    if normalize:\n",
    "        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n",
    "        print(\"Normalized confusion matrix\")\n",
    "    else:\n",
    "        print('Confusion matrix, without normalization')\n",
    "\n",
    "    print(cm)\n",
    "\n",
    "    plt.imshow(cm, interpolation='nearest', cmap=cmap)\n",
    "    plt.title(title)\n",
    "    plt.colorbar()\n",
    "    tick_marks = np.arange(len(classes))\n",
    "    plt.xticks(tick_marks, classes, rotation=45)\n",
    "    plt.yticks(tick_marks, classes)\n",
    "\n",
    "    fmt = '.2f' if normalize else 'd'\n",
    "    thresh = cm.max() / 2.\n",
    "    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):\n",
    "        plt.text(j, i, format(cm[i, j], fmt),\n",
    "                 horizontalalignment=\"center\",\n",
    "                 color=\"white\" if cm[i, j] > thresh else \"black\")\n",
    "\n",
    "    plt.ylabel('True label')\n",
    "    plt.xlabel('Predicted label')\n",
    "    plt.tight_layout()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Confusion matrix, without normalization\n",
      "[[126  21]\n",
      " [ 10 139]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_confusion_matrix(cm = cnf_matrix, classes = [0,1],\n",
    "                          normalize=False,\n",
    "                          title='Confusion matrix')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "使用原始数据集进行测试"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "召回率:  0.9183673469387755\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\validation.py:761: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
      "  y = column_or_1d(y, warn=True)\n"
     ]
    }
   ],
   "source": [
    "Lr = LogisticRegression(C = best_c,penalty = 'l1')\n",
    "Lr.fit(X_train_undersample,y_train_undersample)\n",
    "y_pred = Lr.predict(X_test)\n",
    "\n",
    "cnf_matrix = confusion_matrix(y_test.values,y_pred)\n",
    "np.set_printoptions(precision=2)\n",
    "print('召回率: ',cnf_matrix[1,1]/(cnf_matrix[1,0] + cnf_matrix[1,1]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_confusion_matrix(cm, classes,\n",
    "                          normalize=False,\n",
    "                          title='Confusion matrix',\n",
    "                          cmap=plt.cm.Blues):\n",
    "    \"\"\"\n",
    "    This function prints and plots the confusion matrix.\n",
    "    Normalization can be applied by setting `normalize=True`.\n",
    "    \"\"\"\n",
    "    if normalize:\n",
    "        cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n",
    "        print(\"Normalized confusion matrix\")\n",
    "    else:\n",
    "        print('Confusion matrix, without normalization')\n",
    "\n",
    "    print(cm)\n",
    "\n",
    "    plt.imshow(cm, interpolation='nearest', cmap=cmap)\n",
    "    plt.title(title)\n",
    "    plt.colorbar()\n",
    "    tick_marks = np.arange(len(classes))\n",
    "    plt.xticks(tick_marks, classes, rotation=45)\n",
    "    plt.yticks(tick_marks, classes)\n",
    "\n",
    "    fmt = '.2f' if normalize else 'd'\n",
    "    thresh = cm.max() / 2.\n",
    "    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):\n",
    "        plt.text(j, i, format(cm[i, j], fmt),\n",
    "                 horizontalalignment=\"center\",\n",
    "                 color=\"white\" if cm[i, j] > thresh else \"black\")\n",
    "\n",
    "    plt.ylabel('True label')\n",
    "    plt.xlabel('Predicted label')\n",
    "    plt.tight_layout()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Confusion matrix, without normalization\n",
      "[[76231  9065]\n",
      " [   12   135]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_confusion_matrix(cm = cnf_matrix, classes = [0,1],\n",
    "                          normalize=False,\n",
    "                          title='Confusion matrix',\n",
    "                          cmap=plt.cm.Blues)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "用原始数据来验证Lr模型，有7014个样本被误杀，有12个样本被漏检，误杀率非常的高。所以该模型并不是一个特别好的模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Recall metric in the testing dataset: 1.0\n",
      "Confusion matrix, without normalization\n",
      "[[  0 147]\n",
      " [  0 149]]\n",
      "Recall metric in the testing dataset: 1.0\n",
      "Confusion matrix, without normalization\n",
      "[[  0 147]\n",
      " [  0 149]]\n",
      "Recall metric in the testing dataset: 1.0\n",
      "Confusion matrix, without normalization\n",
      "[[  1 146]\n",
      " [  0 149]]\n",
      "Recall metric in the testing dataset: 0.9932885906040269\n",
      "Confusion matrix, without normalization\n",
      "[[ 52  95]\n",
      " [  1 148]]\n",
      "Recall metric in the testing dataset: 0.9328859060402684\n",
      "Confusion matrix, without normalization\n",
      "[[127  20]\n",
      " [ 10 139]]\n",
      "Recall metric in the testing dataset: 0.8590604026845637\n",
      "Confusion matrix, without normalization\n",
      "[[143   4]\n",
      " [ 21 128]]\n",
      "Recall metric in the testing dataset: 0.8456375838926175\n",
      "Confusion matrix, without normalization\n",
      "[[145   2]\n",
      " [ 23 126]]\n",
      "Recall metric in the testing dataset: 0.738255033557047\n",
      "Confusion matrix, without normalization\n",
      "[[147   0]\n",
      " [ 39 110]]\n",
      "Recall metric in the testing dataset: 0.5369127516778524\n",
      "Confusion matrix, without normalization\n",
      "[[147   0]\n",
      " [ 69  80]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x720 with 18 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "Lr = LogisticRegression(C = 0.01,penalty = 'l1')\n",
    "Lr.fit(X_train_undersample,y_train_undersample.values.ravel())\n",
    "y_pred_undersample_proba = Lr.predict_proba(X_test_undersample.values)\n",
    "\n",
    "#指定阈值\n",
    "thresholds = [0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9]\n",
    "plt.figure(figsize = (10,10))\n",
    "j = 1\n",
    "for i in thresholds:\n",
    "    y_test_predictions_high_recall = y_pred_undersample_proba[:,1] > i\n",
    "    plt.subplot(3,3,j)\n",
    "    j += 1\n",
    "    cnf_matrix = confusion_matrix(y_test_undersample,y_test_predictions_high_recall)\n",
    "    np.set_printoptions(precision=2)\n",
    "    print('Recall metric in the testing dataset:',cnf_matrix[1,1]/(cnf_matrix[1,1]+cnf_matrix[1,0]))\n",
    "    class_names = [0,1]\n",
    "    plot_confusion_matrix(cm = cnf_matrix, classes = [0,1],\n",
    "                          normalize=False,\n",
    "                          title='Thresholds > %s'% i,\n",
    "                          cmap=plt.cm.Blues)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 过采样方案"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "#将原始数据划分为feature和label\n",
    "\n",
    "features_train,features_test,labels_train,labels_test = train_test_split(X,y,test_size=0.2,random_state = 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\validation.py:761: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
      "  y = column_or_1d(y, warn=True)\n"
     ]
    }
   ],
   "source": [
    "from imblearn.over_sampling import SMOTE\n",
    "\n",
    "oversampler = SMOTE(random_state = 0)\n",
    "os_features,os_labels = oversampler.fit_sample(features_train,labels_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "227454"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(os_labels[os_labels == 1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "------------------------\n",
      "正则化惩罚力度:  0.01\n",
      "-------------------------\n",
      " \n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration:  1 召回率 =  0.9161290322580645\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration:  2 召回率 =  0.9144736842105263\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration:  3 召回率 =  0.9098594666371583\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration:  4 召回率 =  0.8918675327815698\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration:  5 召回率 =  0.8926259328870864\n",
      " \n",
      "平均召回率:  0.904991129754881\n",
      " \n",
      "------------------------\n",
      "正则化惩罚力度:  0.1\n",
      "-------------------------\n",
      " \n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration:  1 召回率 =  0.9161290322580645\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration:  2 召回率 =  0.9144736842105263\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration:  3 召回率 =  0.9111652096934824\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration:  4 召回率 =  0.8941317417922423\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration:  5 召回率 =  0.8948461766742507\n",
      " \n",
      "平均召回率:  0.9061491689257133\n",
      " \n",
      "------------------------\n",
      "正则化惩罚力度:  1\n",
      "-------------------------\n",
      " \n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration:  1 召回率 =  0.9161290322580645\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration:  2 召回率 =  0.9144736842105263\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration:  3 召回率 =  0.911297997122939\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration:  4 召回率 =  0.8942306635451358\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration:  5 召回率 =  0.8950769940976687\n",
      " \n",
      "平均召回率:  0.9062416742468669\n",
      " \n",
      "------------------------\n",
      "正则化惩罚力度:  10\n",
      "-------------------------\n",
      " \n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration:  1 召回率 =  0.9161290322580645\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration:  2 召回率 =  0.9144736842105263\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration:  3 召回率 =  0.9113201283611818\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration:  4 召回率 =  0.8944504896626768\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration:  5 召回率 =  0.895131950627054\n",
      " \n",
      "平均召回率:  0.9063010570239006\n",
      " \n",
      "------------------------\n",
      "正则化惩罚力度:  100\n",
      "-------------------------\n",
      " \n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration:  1 召回率 =  0.9161290322580645\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration:  2 召回率 =  0.9144736842105263\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration:  3 召回率 =  0.9113422595994246\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration:  4 召回率 =  0.8944504896626768\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration:  5 召回率 =  0.8951099680152999\n",
      " \n",
      "平均召回率:  0.9063010867491984\n",
      " \n",
      "------------------------------\n",
      "最好的惩罚力度参数:  10.0\n",
      "-------------------------------\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:33: FutureWarning: \n",
      "The current behaviour of 'Series.argmax' is deprecated, use 'idxmax'\n",
      "instead.\n",
      "The behavior of 'argmax' will be corrected to return the positional\n",
      "maximum in the future. For now, use 'series.values.argmax' or\n",
      "'np.argmax(np.array(values))' to get the position of the maximum\n",
      "row.\n"
     ]
    }
   ],
   "source": [
    "os_features = pd.DataFrame(os_features)\n",
    "os_labels = pd.DataFrame(os_labels)\n",
    "best_c = printing_Kfold_scores(os_features,os_labels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "best_c = 10"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\linear_model\\logistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.\n",
      "  FutureWarning)\n",
      "C:\\Users\\taon1\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\validation.py:761: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
      "  y = column_or_1d(y, warn=True)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "召回率:  0.6435643564356436\n"
     ]
    }
   ],
   "source": [
    "Lr = LogisticRegression(C = best_c,penalty = 'l1')\n",
    "Lr.fit(features_train,labels_train)\n",
    "y_pred = Lr.predict(features_test.values)\n",
    "\n",
    "cnf_matrix = confusion_matrix(labels_test.values,y_pred)\n",
    "np.set_printoptions(precision=2)\n",
    "print('召回率: ',cnf_matrix[1,1]/(cnf_matrix[1,0] + cnf_matrix[1,1]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Confusion matrix, without normalization\n",
      "[[56852     9]\n",
      " [   36    65]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_confusion_matrix(cm = cnf_matrix, classes = [0,1],\n",
    "                          normalize=False,\n",
    "                          title='Confusion matrix',\n",
    "                          cmap=plt.cm.Blues)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 项目总结"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "（1）拿到一份数据集的时候，第一步先观察数据集，使用pandas.info(),pandas.descirbe()观察函数。对于二分类问题，观察样本的分布，是否均衡。\n",
    "\n",
    "（2）根据观察到的结果，对数据进行预处理，包括缺失值，重复值，异常值和错误值的处理，类型转换，数据标准化处理，特征提取（特征工程）。\n",
    "\n",
    "（3）确定模型的评估标准，accuracy,precision,recall,roc_auc等。\n",
    "\n",
    "（4）数据预处理完成后，对数据进行切分，training_set,validatin_set,testing_set。\n",
    "\n",
    "（5）建立基本模型。\n",
    "\n",
    "（6）模型优化工作，包括参数的优化和特征的优化。\n",
    "\n",
    "（7）确定最终模型，与实际工作进行组合。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
